#! /bin/sh
# PCP QA Test No. 322
# pmlogger (assorted) and pmlc (PCP 2.0) version compatibility
# any host version ... see 374 for 64-bit host version
#
# Copyright (c) 1995-2002 Silicon Graphics, Inc.  All Rights Reserved.
#

seq=`basename $0`
echo "QA output created by $seq"

# get standard filters
. ./common.product
. ./common.filter
. ./common.check


# based on version 2 or 3 archive remotely ($1)
#
_filter()
{
    tee -a $seq_full \
    | _filter_pmdumplog \
    | sed \
	-e '/^pmlogger .* on host .* is logging metrics from host .*/d' \
	-e '/^PMCD host/d' \
	-e '/^log started/d' \
    | $PCP_AWK_PROG '
BEGIN				{ if ("'"$1"'" >= 3) labelsize=808
				  else labelsize=132
				}
/datax/				{ skip = 3 }
skip > 0			{ skip--; next }
$1 == "log" && $2 == "size"	{ if ($3 == labelsize) $3 = "[label]"
				  else if ($3 > labelsize) $3 = "[label] plus some"
				}
				{ print }'
}

_remote_signal()
{
    host="$1"
    pid="$2"
    base="$3"

    cat <<end-of-file >$tmp.cmd
. \$PCP_DIR/etc/pcp.env
\$PCP_BINADM_DIR/pmsignal -s TERM $pid
sleep 1
\$PCP_BINADM_DIR/pmsignal -s KILL $pid
test -k \$PCP_TMP_DIR/pmlogger || sudo chmod o-w \$PCP_TMP_DIR/pmlogger
rm -f /tmp/$base.*
end-of-file
    scp -q $tmp.cmd pcpqa@$host:$tmp.cmd
    ssh -q pcpqa@$host /bin/sh $tmp.cmd >/dev/null 2>&1
    ssh -q pcpqa@$host "rm -f $tmp.cmd"
}

_speak_to_me()
{
    host=$1
    pid=''
    base=''
    cat <<End-of-File | ssh -q pcpqa@$host sh >$tmp.tmp 2>$tmp.err
if [ -r \$PCP_DIR/etc/pcp.env ]
then
    . \$PCP_DIR/etc/pcp.env
else
    echo "Error: unable to read \$PCP_DIR/etc/pcp.env!" >&2
    exit 1
fi
sudo rm -rf /tmp/\$$ /tmp/\$$.*
echo "# config for qa/$seq from `hostname` on `date`" >/tmp/\$$.config
echo "log mandatory on once { hinv.ncpu }" >>/tmp/\$$.config
echo >>/tmp/\$$.config
echo "[access]" >>/tmp/\$$.config
echo "allow * : all;" >>/tmp/\$$.config
test -k \$PCP_TMP_DIR/pmlogger || sudo chmod o+w \$PCP_TMP_DIR/pmlogger
( pmlogger -L -c /tmp/\$$.config -l /tmp/\$$.log /tmp/\$$ </dev/null >/dev/null 2>&1 ) &
echo pid=\$! base=\$$
End-of-File

    echo >>$seq_full
    echo "stdout from ssh to $host ..." >>$seq_full
    cat $tmp.tmp >>$seq_full
    echo >>$seq_full
    echo "stderr from ssh to $host ..." >>$seq_full
    cat $tmp.err >>$seq_full

    eval `cat $tmp.tmp`

    if [ -z "$pid" ]
    then
	echo "Arrgh ... failed to get remote pmlogger pid for host $host"
	exit
    fi

    if [ -z "$base" ]
    then
	echo "Arrgh ... failed to get remote archive basename for host $host"
	exit
    fi

    eval `ssh -q pcpqa@$host grep PCP_ARCHIVE_VERSION /etc/pcp.conf`
    echo "$host: PCP_ARCHIVE_VERSION=$PCP_ARCHIVE_VERSION" >>$seq_full

    for i in 1 2 3 4 5 6 7 8 9 10
    do
	( echo ; echo "iteration $i" ) >>$seq_full
	if echo quit | pmlc -h $host $pid 2>&1 | tee -a $seq_full | grep 'Connected to' >/dev/null
	then
	    break
	else
	    if [ $i = 10 ]
	    then
		echo "Arrgh ... pmlogger (pid=$pid) on host $host failed to start after 20 seconds"
		ssh -q pcpqa@$host "ps | grep $pid"
		ssh -q pcpqa@$host "ls -l /tmp/$base.*"
		ssh -q pcpqa@$host "cat /tmp/$base.log"
		exit 1
	    fi
	fi
	sleep 2
    done

    # the success cases
    #
    cat <<End-of-File | pmlc 2>&1 | _filter $PCP_ARCHIVE_VERSION
connect $pid@$host
status
new volume
status
flush
# singular, all instances
query { pmcd.simabi pmcd.control.register }
# some instances
query pmcd.agent.type ["sample" "pmcd" "sampledso"]
# non-leaf
query pmcd.pdu_in
# logging
log mandatory on once pmcd.agent.type ["sample" "pmcd"]
End-of-File

    # stopping and starting again should be enough to allow pmlogger
    # to have logged the metrics from the last request ... except the
    # pmlc control port socket may not have been ripped down, so
    # sleep some
    #
    sleep 2

    echo "after first pmlc session ..." >>$seq_full
    ssh -q pcpqa@$host "ps | grep $pid" >>$seq_full 2>&1
    ssh -q pcpqa@$host "ls -l /tmp/$base.*" >>$seq_full 2>&1
    ssh -q pcpqa@$host "cat /tmp/$base.log" >>$seq_full 2>&1

    cat <<End-of-File | pmlc 2>&1 | _filter $PCP_ARCHIVE_VERSION
connect $pid@$host
log mandatory off pmcd.agent.type ["sampledso"]
query pmcd.agent.type ["sample" "pmcd" "sampledso"]
End-of-File

    echo "after second pmlc session ..." >>$seq_full
    ssh -q pcpqa@$host "ps | grep $pid" >>$seq_full 2>&1
    ssh -q pcpqa@$host "ls -l /tmp/$base.*" >>$seq_full 2>&1
    ssh -q pcpqa@$host "cat /tmp/$base.log" >>$seq_full 2>&1

    # the failures
    #
    echo "connect 0@$host" | pmlc 2>&1 | _filter $PCP_ARCHIVE_VERSION

    # cleanup
    #
    if [ ! -z "$host" ]
    then
	_remote_signal $host $pid $base
	pid=''
	base=''
    fi
}

_cleanup()
{
    if $need_clean
    then
	if [ ! -z "$pid" -a ! -z "$base" -a ! -z "$host" ]
	then
	    _remote_signal $host $pid $base
	    pid=''
	    base=''
	fi
	need_clean=false
    fi
    rm -f $tmp.*
    $sudo rm -rf /tmp/\$$ /tmp/\$$.*
}

need_clean=true
status=1	# failure is the default!
trap "_cleanup; exit \$status" 0 1 2 3 15

host=''
pid=''
base=''

# the v1 host may be on the other side of the planet
#
PMCD_CONNECT_TIMEOUT=30
PMCD_REQUEST_TIMEOUT=30
export PMCD_CONNECT_TIMEOUT PMCD_REQUEST_TIMEOUT

# real QA test starts here

# strickly speaking need a remote host runnun pcp>=2, but with old
# PCP 2.7.8 and PCP 4.0.0 hosts in the QA farm, we might pick one of
# them, and there are fewer metrics below pmcd.pdu_in in the PMNS,
# which causes slightly different output for the
#	query pmcd.pdu_in
# below ... so best to avoid that.
#
type="-v pcp>=5.3.5"
echo
echo "=== pmlogger host type: $type ==="
host=`./getpmcdhosts -P -L -n 1 $type`
if [ -z "$host" ]
then
    _notrun "./getpmcdhosts failed to find a suitable host"
    # NOTREACHED
else
    echo "$type => $host" >>$seq_full
    _speak_to_me $host
fi

# output version depends on the PCP version at the _remote_ host
# not the local host as is normally the case
#
REMOTE_VER=`pmprobe -v -h $host pmcd.version \
    | sed -e 's/"$//' -e 's/.*"//' \
    | $PCP_AWK_PROG -F. '{printf "%02d%02d%02d\n",$1,$2,$3}'`
echo "host=$host REMOTE_VER=$REMOTE_VER" >>$seq_full

# success, all done
status=0
exit
